/*
题目描述
给出一段长度为 n 的环状序列 a，即认为 a1和 an是相邻的，选出其中连续不重叠且非空的两段使得这两段和最大。
输入格式
第一行是一个整数 n，表示序列的长度。
第二行有 n 个整数，描述序列 a，第 i 个数字表示 ai。
输出格式
一行一个整数，为最大的两段子段和是多少。
*/

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;

int main(){
	int n;
	cin>>n;
	vector<int> a(n+1);
	
	int total=0;
	bool flag=false;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		total+=a[i];
		if(a[i]>0){
			flag=true;
		}
	}
	
	if(!flag){ //如果全为负数
		sort(a.begin()+1,a.end(),greater<int>());
		cout<<a[1]+a[2]<<endl;
		return 0;
	}
	vector<int> left_max(n+1); //左边的最大值
	vector<int> left_min(n+1); //左边最小值
	vector<int> right_min(n+1); //右边最大值
	vector<int> right_max(n+1); //右边最小值
	
	left_max[1]=a[1],right_max[n]=a[n];
	left_min[1]=a[1],right_min[n]=a[n];
	for(int i=2;i<=n;i++){
		left_max[i]=max(left_max[i-1]+a[i],a[i]);
		left_min[i]=min(left_min[i-1]+a[i],a[i]);
	}
	for(int i=2;i<=n;i++){
		left_min[i]=min(left_min[i-1],left_min[i]);
		left_max[i]=max(left_max[i-1],left_max[i]);
	}
	for(int i=n-1;i>0;i--){
		right_min[i]=min(right_min[i+1]+a[i],a[i]);
		right_max[i]=max(right_max[i+1]+a[i],a[i]);
	}
	for(int i=n-1;i>0;i--){
		right_min[i]=min(right_min[i+1],right_min[i]);
		right_max[i]=max(right_max[i+1],right_max[i]);
	}
	
	int res=-INF;
	int min_circle=INF;
	for(int i=1;i<n;i++){
		res=max(res,left_max[i]+right_max[i+1]); //不环状的最大两段子段和
		min_circle=min(min_circle,left_min[i]+right_min[i+1]); //不环状的最小两段子段和
	}
	int res2=total-min_circle; //环状最大两段子段和为整个数组总长减去不环状的最小两段子段和
	
	cout<<max(res,res2)<<endl;
	return 0;
}